home *** CD-ROM | disk | FTP | other *** search
/ CICA 1993 April / CICA MS Windows - April 1993.iso / unzipped / programr / tp / dnd / papdrop.pas < prev    next >
Pascal/Delphi Source File  |  1992-04-30  |  6KB  |  246 lines

  1. Program PaperDrop;
  2.  
  3. { Drop a bmp on us and it becomes the wallpaper! }
  4.  
  5. {$R-,I-,G+,W-,S-,D-,L-}
  6.  
  7. {$R PAPDROP}
  8.  
  9. Uses
  10.  WinTypes,WinProcs,Win31,ShellAPI,WObjects,Strings;
  11.  
  12. Const
  13.   AppName = 'Paper Drop';
  14.   cm_TileCent = 101;
  15.  
  16. Type
  17.   PPaperWin = ^TPaperWin;
  18.   TPaperWin = Object(TWindow)
  19.                 PixMode : Integer;
  20.                 hSysMenu : HMenu;
  21.  
  22.                 Procedure SetupWindow;
  23.                   Virtual;
  24.  
  25.                 Function GetClassName : PChar;
  26.                   Virtual;
  27.  
  28.                 Procedure GetWindowClass(Var AWndClass : TWndClass);
  29.                   Virtual;
  30.  
  31.                 Procedure WMQueryOpen(Var Msg : TMessage);
  32.                   Virtual wm_QueryOpen;
  33.  
  34.                 Procedure WMDropFiles(var Msg : TMessage);
  35.                   Virtual wm_first + wm_DropFiles;
  36.  
  37.                 Procedure FileDropped(FileName : PChar;
  38.                                       Var DropPos : TPoint;
  39.                                       InClient : Boolean);
  40.                   Virtual;
  41.  
  42.                 Procedure WMSysCommand(Var Msg : TMessage);
  43.                   Virtual wm_SysCommand;
  44.  
  45.                 Procedure CMTileCent(Var Msg : TMessage);
  46.                   Virtual cm_First + cm_TileCent;
  47.  
  48.               End;
  49.  
  50.  TMyApp = Object(TApplication)
  51.             Procedure InitMainWindow;
  52.               Virtual;
  53.           End;
  54.  
  55. {---------------------------------------------------}
  56.  
  57. { --- Utility Procedures --- }
  58.  
  59. { Toggle a checkmark menu item on or off }
  60.  
  61. Procedure ToggleCheck(Menu : HMenu; MenuItemID : Word);
  62.  
  63. Var
  64.   MAttr,WCheck : Word;
  65.  
  66. Begin
  67.   MAttr := GetMenuState(Menu,MenuItemID,mf_ByCommand);
  68.  
  69.   If (MAttr and mf_Checked) = mf_Checked
  70.     Then WCheck := mf_ByCommand Or mf_Unchecked
  71.     Else WCheck := mf_ByCommand Or mf_Checked;
  72.  
  73.   CheckMenuItem(Menu,MenuItemID,WCheck);
  74. End {ToggleCheck};
  75.  
  76. {---------------------------------------------------}
  77.  
  78. { --- Application Methods --- }
  79.  
  80. Procedure TMyApp.InitMainWindow;
  81.  
  82. Begin
  83.   MainWindow := New(PPaperWin,Init(nil,AppName));
  84. End;
  85.  
  86. {---------------------------------------------------}
  87.  
  88. { --- Window Methods --- }
  89.  
  90. Procedure TPaperWin.SetupWindow;
  91.  
  92. Begin
  93.   TWindow.SetupWindow;
  94.  
  95.   { Inform Windows that we accept file drops }
  96.   DragAcceptFiles(hWindow,True);
  97.  
  98.   { Add our menu choice to system menu }
  99.   hSysMenu := GetSystemMenu(HWindow,False);
  100.  
  101.   AppendMenu(hSysMenu,mf_Separator,0,Nil);
  102.   AppendMenu(hSysMenu,mf_String,cm_TileCent,'&Tile Wallpaper');
  103.  
  104.   { Set initial state of menu checkmark }
  105.   PixMode := GetProfileInt('Desktop','TileWallpaper',1);
  106.   If PixMode = 1
  107.     Then CheckMenuItem(hSysMenu,cm_TileCent,mf_ByCommand Or mf_Checked);
  108.  
  109. End {SetupWindow};
  110.  
  111. {---------------------------------------------------}
  112.  
  113. Procedure TPaperWin.WMDropFiles;
  114.  
  115. Var
  116.  NumFiles : word;
  117.  FileName : array[0..127] of char;
  118.  i : word;
  119.  DropPoint : TPoint;
  120.  InClientArea : boolean;
  121.  
  122. Begin
  123.  { Msg.wParam contains a handle to the "drop info" }
  124.  
  125.  { First, find out how many files were dropped }
  126.  NumFiles := DragQueryFile(Msg.wParam,$FFFF,Nil,0);
  127.  
  128.  { Error if more than 1 was dropped }
  129.  If NumFiles > 1
  130.    Then MessageBox(HWindow,'You Can Only Have one Wallpaper Bitmap at a Time!',
  131.                            'Paper Drop Error',mb_Ok or Mb_IconExclamation);
  132.  
  133.  { Next, find out where the file was dropped }
  134.  InClientArea := DragQueryPoint(Msg.wParam,DropPoint);
  135.  
  136.  { Retrieve the dropped file and call the virtual method "FileDropped" }
  137.  DragQueryFile(Msg.wParam,0,FileName,Pred(Sizeof(FileName)));
  138.  FileDropped(FileName,DropPoint,InClientArea);
  139.  
  140.  { Cleanup - tell Windows that we're done with the "drop info" }
  141.  DragFinish(Msg.wParam);
  142.  
  143. End {WMDropFiles};
  144.  
  145. {---------------------------------------------------}
  146.  
  147. Procedure TPaperWin.FileDropped(FileName : PChar;
  148.                                        Var DropPos : TPoint;
  149.                                        InClient : Boolean);
  150.  
  151. Var
  152.   PaperFile : File;
  153.   Tx : Array [0..80] of Char;
  154.   Res : Word;
  155.  
  156. Begin
  157.   { Check for the proper type of file }
  158.   If (StrPos(FileName,'.BMP') = Nil) And
  159.      (StrPos(FileName,'.RLE') = Nil)
  160.    Then MessageBox(HWindow,'Pteui!  Bleah!  I can Only Load Bitmaps, Buster',
  161.                            'Paper Drop Error',mb_Ok or Mb_IconExclamation)
  162.  
  163.    Else { Set the wallpaper and update WIN.INI }
  164.         SystemParametersInfo(spi_SetDeskWallpaper,0,FileName,spif_UpdateIniFile);
  165. End {FileDropped};
  166.  
  167. {---------------------------------------------------}
  168.  
  169. Procedure TPaperWin.WMQueryOpen(Var Msg : TMessage);
  170.  
  171. Begin
  172.   Msg.Result := 0;       { Deny open }
  173. End {WMQueryOpen};
  174.  
  175. {---------------------------------------------------}
  176.  
  177. Function TPaperWin.GetClassName;
  178.  
  179. Begin
  180.   GetClassName := AppName;
  181. End {GetClassName};
  182.  
  183. {---------------------------------------------------}
  184.  
  185. Procedure TPaperWin.GetWindowClass(Var AWndClass : TWndClass);
  186.  
  187. Begin
  188.   TWindow.GetWindowClass(AWndClass);
  189.  
  190.   AWndClass.hIcon := LoadIcon(HInstance,'_PAPER');
  191. End {GetWindowClass};
  192.  
  193. {---------------------------------------------------}
  194.  
  195. Procedure TPaperWin.WMSysCommand(Var Msg : TMessage);
  196.  
  197. Begin
  198.   Case Msg.wParam of
  199.     cm_TileCent : CMTileCent(Msg);
  200.     Else DefWndProc(Msg);
  201.   End;
  202. End {WMSysCommand};
  203.  
  204. {---------------------------------------------------}
  205.  
  206. { --- Menu Response Methods --- }
  207.  
  208. Procedure TPaperWin.CMTileCent(Var Msg : TMessage);
  209.  
  210. Var
  211.   PixModeStr : Array [0..2] of Char;
  212.  
  213. Begin
  214.   { Get center/tile option }
  215.   PixMode := GetProfileInt('Desktop','TileWallpaper',1);
  216.  
  217.   { Invert it }
  218.   If PixMode = 1
  219.     Then PixMode := 0
  220.     Else PixMode := 1;
  221.  
  222.   Str(PixMode,PixModeStr);
  223.  
  224.   ToggleCheck(hSysMenu,cm_TileCent);
  225.  
  226.   { Write it out }
  227.   WriteProfileString('Desktop','TileWallpaper',PixModeStr);
  228.  
  229.   { Redraw desktop }
  230.   SystemParametersInfo(spi_SetDeskWallpaper,0,Nil,0);
  231.  
  232. End {CMTileCent};
  233.  
  234. {---------------------------------------------------}
  235.  
  236. Var
  237.   MyApp : TMyApp;
  238.  
  239. Begin
  240.   CmdShow := sw_ShowMinNoActive;
  241.  
  242.   MyApp.Init(AppName);
  243.   MyApp.Run;
  244.   MyApp.Done;
  245. End.
  246.